package com.vincent.utils;

import java.util.HashMap;
import java.util.Map;

/**
 * PValueSet装入一组PValue，以及相应slot的最高ballot号，并支持相关的函数
 * Created by wensen on 2016/12/8.
 */
public class PValueSet {

    private Map<Long, PValue> pvalues;
    public PValueSet() {
        pvalues = new HashMap<Long, PValue>();
    }

    /**
     * 如果存在slot对应的(command, proposal)并且slot小于pvalue的slot，则覆写
     * @param pvalue
     */
    public void add(PValue pvalue) {
        if (pvalues.containsKey(pvalue.slot_number())) {
            if (pvalues.get(pvalue.slot_number()).ballot_number().compareTo(pvalue.ballot_number()) < 0) {
                this.pvalues.put(pvalue.slot_number(), pvalue);
            }
        } else {
            this.pvalues.put(pvalue.slot_number(), pvalue);
        }
    }

    public Map<Long, PValue> pvalues() {
        return this.pvalues;
    }

    public void remove(PValue pvalue) {
        this.pvalues.remove(pvalue.slot_number());
    }

    /**
     * 给定PValueSet更新自身的pvalues，可能会覆写ballot号低的PValue
     * @param given_pvalueset
     */
    public void update(PValueSet given_pvalueset) {

        Map<Long, PValue> pvalueset = given_pvalueset.pvalues();
        for (Map.Entry<Long, PValue> candidate : pvalueset.entrySet()) {
            this.add(candidate.getValue());
        }
    }

    public int len() {
        return pvalues.size();
    }

    public String toString() {

        String ret = "";
        for (Map.Entry<Long, PValue> candidate : pvalues.entrySet()) {
            ret += candidate.getValue() + "\n";
        }
        return ret;
    }

}
